/* eslint-disable */
import { ElMessage } from 'element-plus';
import ExcelJS from 'exceljs';
import { saveAs } from 'file-saver';
import mitt from 'mitt';

export default mitt();

// 保存数据
export const setSession = (key, value) => {
  window.sessionStorage.setItem(key, JSON.stringify(value));
};

// 取数据
export const getSession = (key) => {
  return JSON.parse(window.sessionStorage.getItem(key));
};

// 删数据
export const delSession = (key) => {
  window.sessionStorage.removeItem(key);
};

// 保存数据
export const setLocal = (key, value) => {
  window.localStorage.setItem(key, JSON.stringify(value));
};

// 取数据
export const getLocal = (key) => {
  return JSON.parse(window.localStorage.getItem(key));
};

// 删数据
export const delLocal = (key) => {
  window.localStorage.removeItem(key);
};

/**
 * 度 转 度分秒
 */
export function degree2dms(degree) {
  const _degree = parseInt(degree);
  const minutes = parseInt(('.' + String(degree).split('.')[1]) * 60);
  const seconds = parseInt(('.' + String(('.' + String(degree).split('.')[1]) * 60).split('.')[1]) * 60);

  return `${_degree || '0'}°${minutes || '00'}′${seconds || '00'}″`;
}

/**
 * 电话号码
 * @param {* val}
 */

export const isMobile = (val) => {
  // eslint-disable-next-line no-useless-escape

  var reg = '^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-9])|(18[0-9])|166|198|199|191|(147))\\d{8}$';
  //创建正则表达式对象
  var regExp = new RegExp(reg);

  // const phone = new RegExp('^1[3578]\\d{9}$');

  //手机号码
  if (regExp.test(val)) {
    return true;
  }

  return false;
};

/**
 * 字符串中是否存在特殊字符
 * 存在返回true
 * @param str
 * @retun boolean
 */
export const isSymbol = (str) => {
  let specialChars = '~`!！@#$￥%^…&*()（）_=+[]{}【】、|\\;:；：“‘,<>《》?？，。';
  let len = specialChars.length;

  for (let i = 0; i < len; i++) {
    if (str.indexOf(specialChars.substring(i, i + 1)) != -1) {
      return true;
    }
  }

  return false;
};

/**
 * 字符串中是否存在数字
 * 存在返回true
 * @param str
 * @retun boolean
 */
export const checkRate = (str) => {
  const reg = /\d/g;

  if (reg.test(str)) {
    return true;
  }

  return false;
};

/**
 * 字符串中是否存在汉子
 * 存在返回true
 * @param str
 * @retun boolean
 */
export const isSymbolTxt = (str) => {
  const reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g');

  if (reg.test(str)) {
    return true;
  } else {
    return false;
  }
};

/**
 * 验证字符串中是否是数字
 * 是返回true
 * @param str
 * @retun boolean
 */
export const checkNumber = (str) => {
  const reg = /^[0-9]+.?[0-9]*$/;

  if (reg.test(str)) {
    return true;
  }

  return false;
};

/**
 * 验证字符串中是否包含英文
 * 是返回true
 * @param str
 * @retun boolean
 */
export const isSymbolEng = (str) => {
  let pattern = /[a-zA-Z]/;

  if (pattern.test(str)) {
    return true;
  }

  return false;
};

/**
 * 根据身份证号获取性别和年龄
 * @param idCard
 */
export function AnalyzeIDCard(IDCord) {
  var sexAndAge = {};
  //获取用户身份证号码
  var userCard = IDCord;

  //如果用户身份证号码为undefined则返回空
  if (!userCard) {
    return sexAndAge;
  }

  // 获取性别
  if (parseInt(userCard.substr(16, 1)) % 2 == 1) {
    sexAndAge.sex = '男';
  } else {
    sexAndAge.sex = '女';
  }

  // 获取出生日期
  var yearBirth = userCard.substring(6, 10);
  var monthBirth = userCard.substring(10, 12);
  var dayBirth = userCard.substring(12, 14);
  // 获取当前年月日并计算年龄
  var myDate = new Date();
  var monthNow = myDate.getMonth() + 1;
  var dayNow = myDate.getDate();
  var age = myDate.getFullYear() - yearBirth;

  if (monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)) {
    age--;
  }

  // 得到年龄
  sexAndAge.age = age;

  // 返回 性别和年龄
  return sexAndAge;
}

/**
 * 身份证正则
 * @param {* val}
 */

export const isCardNo = (card) => {
  // 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X
  const reg =
    /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/;

  if (reg.test(card)) {
    return true;
  }

  return false;
};

/**
 * 数组去重
 *  @param { Array} arr
 */

export const UNIQUE = (arr) => {
  let newarr = [];

  arr.forEach((item) => {
    if (!newarr.includes(item)) {
      newarr.push(item);
    }
  });

  return newarr;
};

/**
 * 处理前端文件上传大小--文档(上传文件大小大小不能超过 50MB)
 *  @param {Object} file 文件数据
 */
export const UPLOAD_FILE_SIZE_DOCUMENT = (file) => {
  if (file.size / 1024 / 1024 < 50) return true;

  return false;
};

/**
 * 处理前端文件上传大小--图片(上传文件大小大小不能超过 10MB)
 *  @param {Object} file 文件数据
 */
export const UPLOAD_FILE_SIZE_PHOTO = (file) => {
  if (file.size / 1024 / 1024 < 10) return true;

  return false;
};

/**
 * 处理前端文件上传类型--图片
 *  @param {Object} file 文件数据
 */
export const UPLOAD_FILE_TYPE_PHOTO = (file) => {
  if (['image/jpeg', 'image/png', 'image/bmp', 'image/jpg'].includes(file.type)) return true;

  return false;
};

/**
 * 处理前端视频上传类型--视频
 *  @param {Object} file 文件数据
 */
export const UPLOAD_FILE_TYPE_VIDEO = (file) => {
  if (['video/mp4'].includes(file.type)) return true;

  return false;
};

//  将字符串数组转换成数组
export const PARSE_STRING_ARRAY = (str) => {
  let right = null;
  let parent = null;

  let value = '';

  for (let i = 0; i < str?.length; i++) {
    const letter = str[i];

    if (letter === '[') {
      right = ']';
      parent = new Array();
    } else if (letter === ']') {
      if (right === letter && value) {
        parent.push(value);
        value = '';
        right = null;
      }
    } else if (letter === ',') {
      if (right === ']') {
        parent.push(value);
        value = '';
      }
    } else {
      // non empty
      if (letter && letter !== ' ') {
        value += letter;
      }
    }
  }

  return parent;
};

// 导出excel
export const exportExcel = async (columns, exclude, data, excelName) => {
  const workbook = new ExcelJS.Workbook();

  const sheet = workbook.addWorksheet(excelName, {
    views: [
      {
        showGridLines: true,
      },
    ],
  });
  const headerCell = new Array(columns?.length ?? 99).fill('A');
  const headers = columns
    .map((item) => {
      if (!exclude.includes(item.dataIndex)) {
        return {
          header: item.title,
          key: item.dataIndex,
        };
      }
    })
    .filter(Boolean);

  sheet.columns = headers;
  headers.forEach((_, index) => {
    sheet.getCell(String(headerCell[index]) + String(1)).font = {
      bold: false,
    };
  });
  data.forEach((item) => {
    sheet.addRow(item);
  });

  const buffer = await workbook.xlsx.writeBuffer();

  saveAs(new Blob([buffer]), `${excelName}.xlsx`);
  ElMessage({
    type: 'success',
    message: '导出成功!',
  });
};

/**
 * 下载文件 可换名
 * @param {*} url
 * @param {*} fileName
 */

export function handleDownload(url, fileName) {
  /**
   * 获取 blob
   * @param  {String} url 目标文件地址
   * @return {cb}
   */
  function getBlob(url, cb) {
    var xhr = new XMLHttpRequest();

    xhr.open('GET', url, true);
    xhr.responseType = 'blob';

    xhr.onload = function () {
      if (xhr.status === 200) {
        cb(xhr.response);
      }
    };

    xhr.send();

    return xhr;
  }

  /**
   * 保存
   * @param  {Blob} blob
   * @param  {String} filename 想要保存的文件名称
   */
  function saveAss(blob, filename) {
    if (window.navigator.msSaveOrOpenBlob) {
      navigator.msSaveBlob(blob, filename);
    } else {
      var link = document.createElement('a');
      var body = document.querySelector('body');

      link.href = window.URL.createObjectURL(blob);
      link.download = filename;

      // fix Firefox
      link.style.display = 'none';
      body.appendChild(link);

      link.click();
      body.removeChild(link);

      window.URL.revokeObjectURL(link.href);
    }
  }

  try {
    let xhr = getBlob(url, (blob) => {
      saveAss(blob, fileName);
    });

    if (xhr.status == 0 || xhr.status == 200) {
      return true;
    } else {
      return false;
    }
  } catch (err) {
    return false;
  }
}

/**
 * 字节转换成 B KB MB GB 的方法
 *
 *
 */

export function SizeTostr(size) {
  var data = '';

  if (size < 0.1 * 1024) {
    //如果小于0.1KB转化成B
    data = size.toFixed(2) + 'B';
  } else if (size < 0.1 * 1024 * 1024) {
    //如果小于0.1MB转化成KB
    data = (size / 1024).toFixed(2) + 'KB';
  } else if (size < 0.1 * 1024 * 1024 * 1024) {
    //如果小于0.1GB转化成MB
    data = (size / (1024 * 1024)).toFixed(2) + 'MB';
  } else {
    //其他转化成GB
    data = (size / (1024 * 1024 * 1024)).toFixed(2) + 'GB';
  }

  var sizestr = data + '';
  var len = sizestr.indexOf('.');
  var dec = sizestr.substr(len + 1, 2);

  if (dec == '00') {
    //当小数点后为00时 去掉小数部分
    return sizestr.substring(0, len) + sizestr.substr(len + 3, 2);
  }

  return sizestr;
}

/**
 * 去除字符串中的标签
 *
 */
export function delHtmlTag(str) {
  return str.replace(/<[^>]+>|\&nbsp;/g, '');
}

/**
 *根据其他元素固定高度获取表格自适应最大高度
 *
 * @export
 * @param {number} [baseH=620]
 * @param {number} [qt=460]
 * @return {*}
 */
export function getTabMaxHeight(baseH = 620, qt = 460) {
  let h = window.screen.height - qt;
  console.log(h, baseH, window.screen.height, 33);
  return h > baseH ? h : baseH;
}

/**
 * 统一社会信用代码
 *
 * @export
 * @param {number} [baseH=620]
 * @param {number} [qt=460]
 * @return {*}
 */
export function checkSocialCardNumber(value) {
  if (value == '') {
    return false;
  } else {
    var firstarray = [
      '0',
      '1',
      '2',
      '3',
      '4',
      '5',
      '6',
      '7',
      '8',
      '9',
      'A',
      'B',
      'C',
      'D',
      'E',
      'F',
      'G',
      'H',
      'I',
      'J',
      'K',
      'L',
      'M',
      'N',
      'O',
      'P',
      'Q',
      'R',
      'S',
      'T',
      'U',
      'V',
      'W',
      'X',
      'Y',
      'Z',
    ];
    var firstkeys = [3, 7, 9, 10, 5, 8, 4, 2];
    var secondarray = [
      '0',
      '1',
      '2',
      '3',
      '4',
      '5',
      '6',
      '7',
      '8',
      '9',
      'A',
      'B',
      'C',
      'D',
      'E',
      'F',
      'G',
      'H',
      'J',
      'K',
      'L',
      'M',
      'N',
      'P',
      'Q',
      'R',
      'T',
      'U',
      'W',
      'X',
      'Y',
    ];
    var secondkeys = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];

    // eslint-disable-next-line no-inner-declarations
    function calc(code, array1, array2, b) {
      var count = 0;

      for (var i = 0; i < array2.length; i++) {
        var a = code[i];

        count += array2[i] * array1.indexOf(a);
      }

      var remainder = count % b;

      return remainder === 0 ? 0 : b - remainder;
    }

    var code = value.toUpperCase();

    if (code.length != 18) {
      return false;
    }

    var reg = /^\w\w\d{6}\w{9}\w$/;

    if (!reg.test(code)) {
      return false;
    } else {
      // 登记管理部门代码：使用阿拉伯数字或大写英文字母表示。​
      // 机构编制：1​
      // 民政：5​
      // 工商：9​
      // 其他：Y

      let reg1 = /^[1,5,9,Y]\w\d{6}\w{9}\w$/;

      if (!reg1.test(code)) {
        return false;
      } else {
        /*
          机构类别代码：使用阿拉伯数字或大写英文字母表示。​
          机构编制机关：11打头​​
          机构编制事业单位：12打头​
          机构编制中央编办直接管理机构编制的群众团体：13打头​​
          机构编制其他：19打头​
          民政社会团体：51打头​
          民政民办非企业单位：52打头​
          民政基金会：53打头​
          村民委员会：54打头
          民政其他：59打头​
          工商企业：91打头​
          工商个体工商户：92打头​
          工商农民专业合作社：93打头​
          其他：Y1打头​
      */
        let reg2 =
          /^(11|12|13|19|21|31|32|33|34|35|41|51|52|53|54|55|61|62|59|71|72|81|91|92|93|A1|G1|J1|N1|N2|N3|Y1)\d{6}\w{9}\w$/;

        if (!reg2.test(code)) {
          return false;
        } else {
          /*
              登记管理机关行政区划码：只能使用阿拉伯数字表示。按照GB/T 2260编码。​
              例如：四川省成都市本级就是510100；四川省自贡市自流井区就是510302。​
              */
          let reg3 =
            /^(11|12|13|19|21|31|32|33|34|35|41|51|52|53|54|55|61|62|59|71|72|81|91|92|93|A1|G1|J1|N1|N2|N3|Y1)\d{6}\w{9}\w$/;

          if (!reg3.test(code)) {
            return false;
          } else {
            var firstkey = calc(code.substr(8), firstarray, firstkeys, 11);
            var firstword;

            if (firstkey < 10) {
              firstword = firstkey;
            }

            if (firstkey == 10) {
              firstword = 'X';
            } else if (firstkey == 11) {
              firstword = '0';
            }

            if (firstword != code.substr(16, 1)) {
              return false;
            } else {
              var secondkey = calc(code, secondarray, secondkeys, 31);
              var secondword = secondarray[secondkey];

              if (!secondword || secondword != code.substr(17, 1)) {
                return false;
              } else {
                var word = code.substr(0, 16) + firstword + secondword;

                if (code != word) {
                  return false;
                } else {
                  return true;
                }
              }
            }
          }
        }
      }
    }
  }
}

/**
 *校验密码
 *密码必须是6~20位、必须含有大小写字母和数字
 * @export
 * @param {*} value
 * @return {*}
 */
export function validatePassWord(value) {
  const passVal = /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d]{6,20}$/;

  return value && passVal.test(value);
}

/**
 *生产数据数据处理
 *一维数组处理成树形结构
 * @export
 * @param {*} value
 * @return {*}
 */
export const getDisposeData = (college) => {
  //先用map结构记录
  function arrayToMap(data) {
    var map = {};

    for (var i = 0; i < data.length; i++) {
      let name = data[i].seedlingName;

      if (name != undefined) {
        if (map[name] == undefined) {
          map[name] = [];
        }

        map[name].push(data[i]);
      }
    }

    return map;
  }

  //把map转成数组
  function mapToArray(data) {
    let array = [];

    for (let p in data) {
      array.push(data[p]);
    }

    return array;
  }

  function arrayToTree(array) {
    // 取出第一个元素作为根节点
    const root = array.shift();

    if (array.length) {
      root.children = array;
    } else {
      root.children = [];
    }

    return root;
  }

  const treeArr = mapToArray(arrayToMap(college)).map((item) => {
    var tree = arrayToTree(item);

    return tree;
  });

  return treeArr;
};
